﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Objects;
using Entidades;
using System.Collections;
using System.Data.SqlClient;

namespace CapaDatos.Adapters
{
   public class DiaFeriadoAdapter
    {

        BDRinconLuzEntities contexto;

       public DiaFeriadoAdapter()
        {
            contexto = RinconLuzContext.Context;
        }

       public DiaFeriadoAdapter(string edicion)
        {
            contexto = RinconLuzContext.ContextNew;
        }


       public void Agregar(DiaFeriado entidad)
        {
            if (entidad == null)
            {
                throw new ArgumentNullException("entidad", "La entidad no puede ser nula.");
            }

            if (entidad.ChangeTracker != null && entidad.ChangeTracker.State == ObjectState.Added)
            {
                contexto.RegistrarCambios(entidad);
                contexto.RealizarCambios();
            }
        }

       public void Eliminar(DiaFeriado entidad)
        {
            if (entidad == null)
            {
                throw new ArgumentNullException("entidad", "La entidad no puede ser nula.");
            }

            IObjectSet<DiaFeriado> objectSet = contexto.CrearSet<DiaFeriado>();

            objectSet.Attach(entidad);
            objectSet.DeleteObject(entidad);
        }



       public void Modificar(DiaFeriado entidad)
        {
            if (entidad == null)
            {
                throw new ArgumentNullException("entidad", "La entidad no puede ser nula.");
            }

            if (entidad.ChangeTracker != null && (entidad.ChangeTracker.State & ObjectState.Deleted) != ObjectState.Deleted)
            {
                entidad.MarkAsModified();
            }

            contexto.SaveChanges();
        }


       public IEnumerable<ActividadDidactica> Obtener()
        {
            return contexto.CrearSet<ActividadDidactica>();
        }





       public bool ExisteEntidad(DiaFeriado dia)
       {

           var Existe = (from v in contexto.DiaFeriado
                          where v.FechaFeriado == dia.FechaFeriado &&
                          v.IdDiaFeriado != dia.IdDiaFeriado  &&
                          v.Eliminado != true
                          select v).Any();

           return Existe;
       }

       public bool ExisteEntidad(Guid id)
       {

           var Existe = (from v in contexto.DiaFeriado
                         where v.IdDiaFeriado == id
                         select v).Any();

           return Existe;
       }


       public DiaFeriado ObtenerEntidad(Guid id)
       {

           var Entidad = (from v in contexto.DiaFeriado
                         where v.IdDiaFeriado == id
                         select v).First();

           return Entidad;
       }



       public List<ViewEntity> ObtenerDiasFeriadosPorAño(int año)
       {
           List<ViewEntity> ListaFinal = new List<ViewEntity>();

           var listaDiasFeriados = (from v in contexto.DiaFeriado
                                      where v.FechaFeriado.Year == año &&
                                       v.Eliminado != true
                                      select v).ToList();


           foreach (var item in listaDiasFeriados)
           {
               ListaFinal.Add(new ViewEntity(item.IdDiaFeriado, item.FechaFeriado.ToShortDateString() + " - " + item.DescripcionFeriado ));

           }

           return ListaFinal;
       }



       public List<DiaFeriado> ObtenerFeriadosPorAño(DateTime periodo)
       {          

           var ListaDiasFeriados = (from v in contexto.DiaFeriado
                                    where v.FechaFeriado.Year == periodo.Year &&
                                            v.FechaFeriado.Month == periodo.Month &&
                                     v.Eliminado != true
                                    select v).ToList();


           return ListaDiasFeriados;
       }




       public bool ExistenActividadesPlanificadas(DiaFeriado dia)
       {

           string nombreMes = this.ObtenerNombreMes(dia.FechaFeriado.Month);

           var ExistePlanificacion = (from v in contexto.PlanificacionProyectoDidactico
                                where v.MesPlanificacion == nombreMes &&
                                v.AñoPlanificacion == dia.FechaFeriado.Year &&
                                v.Eliminada != true
                                select v).Any();

           if (ExistePlanificacion)
           {

               var Planificacion = (from v in contexto.PlanificacionProyectoDidactico
                                    where v.MesPlanificacion == nombreMes &&
                                    v.AñoPlanificacion == dia.FechaFeriado.Year &&
                                    v.Eliminada != true
                                    select v).First();

               if (Planificacion != null)
               {

                   var Existe = (from v in Planificacion.PlanificacionesDiariasProyectoDidactico
                                 where v.Dia == dia.FechaFeriado.Day
                                 select v).Any();


                   return Existe;
               }
               else
                   return false;


           }
           else
               return false;

       }




       internal string ObtenerNombreMes(int mes)
       {

           switch (mes)
           {

               case 1:
                   return "Enero";

               case 2:
                   return "Febrero";

               case 3:
                   return "Marzo";

               case 4:
                   return "Abril";

               case 5:
                   return "Mayo";

               case 6:
                   return "Junio";

               case 7:
                   return "Julio";

               case 8:
                   return "Agosto";

               case 9:
                   return "Septiembre";

               case 10:
                   return "Octubre";

               case 11:
                   return "Noviembre";

               case 12:
                   return "Diciembre";

               default: return "Ninguno";

           }

       }





    }
}
